/**
 * 场地数据处理器基类
 */
export class BaseVenueProcessor {
  constructor() {
    this.venueName = '';
    this.selectedDate = '';
  }

  /**
   * 处理场地数据
   * @param {Object} data - 原始场地数据
   * @param {string} selectedDate - 选中的日期
   * @returns {Array} 处理后的场地列表
   */
  process(data, selectedDate) {
    this.selectedDate = selectedDate;
    if (!this.validateData(data)) {
      return [];
    }
    
    const venueMap = this.groupVenues(data);
    this.processTimeSlots(venueMap, data);
    return this.convertToVenueList(venueMap);
  }

  /**
   * 验证数据是否有效
   * @param {Object} data - 原始场地数据
   * @returns {boolean} 数据是否有效
   */
  validateData(data) {
    // 子类需要重写此方法
    return true;
  }

  /**
   * 按场地名称分组
   * @param {Object} data - 原始场地数据
   * @returns {Map} 场地Map
   */
  groupVenues(data) {
    // 子类需要重写此方法
    return new Map();
  }

  /**
   * 处理时间槽
   * @param {Map} venueMap - 场地Map
   * @param {Object} data - 原始场地数据
   */
  processTimeSlots(venueMap, data) {
    // 子类需要重写此方法
  }

  /**
   * 转换为场地列表
   * @param {Map} venueMap - 场地Map
   * @returns {Array} 场地列表
   */
  convertToVenueList(venueMap) {
    // 子类需要重写此方法
    return [];
  }

  /**
   * 生成时间槽（6:00-23:00）
   * @returns {Array} 时间槽数组
   */
  generateTimeSlots() {
    const timeSlots = [];
    for (let hour = 6; hour <= 23; hour++) {
      const startTime = `${hour.toString().padStart(2, '0')}:00`;
      const endTime = `${(hour + 1).toString().padStart(2, '0')}:00`;
      timeSlots.push(`${startTime}-${endTime}`);
    }
    return timeSlots;
  }

  /**
   * 解析价格信息
   * @param {string} priceJson - 价格JSON字符串
   * @param {string} timeSlot - 时间槽
   * @returns {number} 价格
   */
  parsePrice(priceJson, timeSlot) {
    try {
      if (!priceJson) return 0;
      
      const priceConfig = JSON.parse(priceJson);
      if (!priceConfig || !priceConfig.timeList || !priceConfig.timeList.length) return 0;
      
      const [startTime, endTime] = timeSlot.split('-');
      const timePrice = priceConfig.timeList.find(tp => {
        const [configStart, configEnd] = tp.timeRange.split('-');
        return startTime >= configStart && endTime <= configEnd;
      });
      
      return timePrice ? parseInt(timePrice.money) : 0;
    } catch (e) {
      console.error('解析价格信息失败:', e);
      return 0;
    }
  }

  /**
   * 检查时间是否重叠
   * @param {string} start1 - 开始时间1
   * @param {string} end1 - 结束时间1
   * @param {string} start2 - 开始时间2
   * @param {string} end2 - 结束时间2
   * @returns {boolean} 是否重叠
   */
  isTimeOverlap(start1, end1, start2, end2) {
    const formatDateForIOS = (dateStr) => {
      if (!dateStr) return new Date();
      
      if (dateStr.includes('T') || dateStr.includes('/')) {
        return new Date(dateStr);
      }
      
      const formattedStr = dateStr.replace(/-/g, '/');
      return new Date(formattedStr);
    };
    
    const s1 = formatDateForIOS(start1).getTime();
    const e1 = formatDateForIOS(end1).getTime();
    const s2 = formatDateForIOS(start2).getTime();
    const e2 = formatDateForIOS(end2).getTime();
    
    return s1 < e2 && e1 > s2;
  }
}

export default BaseVenueProcessor;